home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / ARCHIVES.SWG / 0014_Self Modify PKLITE files.pas < prev    next >
Pascal/Delphi Source File  |  1993-11-02  |  5KB  |  194 lines

  1. {
  2. ANTHONY GELAT
  3.  
  4. >>Is it the size of the EXE File?  You can compress it With PKLite or
  5. >>LZEXE - it'll load into memory With full size, though.  This just
  6.  
  7. >Nope, it has self modifying data.  PKLiting it wouldn't work.
  8.  
  9.  I have code For a self modifying EXE that claims to be PKLITEable,
  10.  so i believe it can be done...here it is
  11. }
  12.  
  13. Unit PCkSelfM;
  14. { Programmer: Jim Nicholson
  15.  
  16. Purpose: Implement a method For creating "self-modifying" .EXE Files from
  17. TP which will survive the encoding techniques used by LZEXE and PKLite(tm).
  18. For discussion and examples, see SelfMod.Pas
  19. This Unit contains code placed into the public domain, With the following
  20.          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  21. provision:
  22. Please do not distribute modified versions of this code Without indicating
  23. such modification by commenting the File.
  24. if you have questions, comments, modifications, or suggestions, please
  25. feel free to contact us:
  26.  
  27.              PCkS Associates
  28.              138 Frances Place
  29.              Hillside, NJ 07205
  30.  
  31.              On CompuServe, EasyPlex to    70152,332
  32.              On Delphi                     CHICKENJN
  33.              On GENie                      J.NICHOLSON1
  34.  
  35. }
  36.  
  37. Interface
  38.  
  39. Var
  40.   ExeFileName : String[128];
  41.  
  42. Function  ConfigBlockPresent(Size : Integer)          : Boolean;
  43. Function  NewConfigBlock(Var C_B; Size : Integer)     : Boolean;
  44. Function  ReadConfigBlock(Var C_B; Size : Integer)    : Boolean;
  45. Function  ConfigBlockReWrite(Var C_B; Size : Integer) : Boolean;
  46.  
  47. Implementation
  48.  
  49. Uses
  50.   Dos;
  51.  
  52. Const
  53.   SelfModHeader : String[10] = 'PCkS SMODF';
  54.   CtrlZ         : Char = ^Z;
  55.  
  56. Var
  57.   ExeFile : File;
  58.   Buffer  : String[10];
  59.  
  60. Function ConfigBlockPresent(Size : Integer) : Boolean;
  61. begin
  62.   assign(ExeFile, ExeFileName);
  63.   reset(ExeFile, 1);
  64.   seek(ExeFile, FileSize(ExeFile) - (SizeOf(SelfModHeader) + Size + 1));
  65.   BlockRead(ExeFile, Buffer, SizeOf(SelfModHeader));
  66.   if Buffer = SelfModHeader then
  67.     ConfigBlockPresent := True
  68.   else
  69.     ConfigBlockPresent := False;
  70.   close(ExeFile);
  71. end;
  72.  
  73. Function NewConfigBlock(Var C_B; Size : Integer) : Boolean;
  74. begin
  75.   NewConfigBlock := False;
  76.   if not ConfigBlockPresent(Size) then
  77.   begin
  78.     assign(ExeFile, ExeFileName);
  79.     reset(ExeFile, 1);
  80.     Seek(ExeFile, FileSize(ExeFile));
  81.     BlockWrite(ExeFile, SelfModHeader, SizeOf(SelfModHeader));
  82.     BlockWrite(ExeFile, C_B, Size);
  83.     BlockWrite(ExeFile, CtrlZ, 1);
  84.     close(ExeFile);
  85.     NewConfigBlock := True;
  86.   end;
  87. end;
  88.  
  89. Function ReadConfigBlock(Var C_B; Size : Integer) : Boolean;
  90. begin
  91.   ReadConfigBlock := False;
  92.   if ConfigBlockPresent(Size) then
  93.   begin
  94.     assign(ExeFile, ExeFileName);
  95.     reset(ExeFile, 1);
  96.     seek(ExeFile, FileSize(ExeFile) - (Size + 1));
  97.     BlockRead(ExeFile, C_B, Size);
  98.     close(ExeFile);
  99.     ReadConfigBlock := True;
  100.   end;
  101. end;
  102.  
  103. Function ConfigBlockReWrite(Var C_B; Size : Integer) : Boolean;
  104. Var
  105.   Temp : String;
  106. begin
  107.   ConfigBlockReWrite := False;
  108.   if ConfigBlockPresent(Size) then
  109.   begin
  110.     assign(ExeFile, ExeFileName);
  111.     reset(ExeFile, 1);
  112.     seek(ExeFile, FileSize(ExeFile) - (SizeOf(SelfModHeader) + Size + 1));
  113.     BlockWrite(ExeFile, SelfModHeader, SizeOf(SelfModHeader));
  114.     BlockWrite(ExeFile, C_B, Size);
  115.     BlockWrite(ExeFile, CtrlZ, 1);
  116.     close(ExeFile);
  117.     ConfigBlockReWrite := True;
  118.   end;
  119. end;
  120.  
  121. begin
  122.   ExeFileName := ParamStr(0);
  123. end.
  124.  
  125.  
  126. {--------------------------And SELFMOD.PAS, referenced above: }
  127. Program SelfMod;
  128.  
  129. {
  130.    This demonstrates a technique For creating self-modifying .EXE Files. It
  131.    has an advantage over techniques which use Typed Constants, in that it will
  132.    survive LZEXEC and PkLite(tm).
  133.  
  134.    Note that if the Program is run before LZEXEC is used to compress it, the
  135.    compressed Program will not have been initialized. This is because LZEXEC
  136.    strips off the config block (and everything else) at the end of the .EXE
  137.    File. This problem does not occur With PKLite(tm).
  138.  
  139.    To run the demo, compile the Program and execute it twice. Whatever
  140.    String you enter is written to the end of the .EXE File.
  141.  
  142.    To further demonstrate it's ablities, compress the File With PKLite(tm) or
  143.    LZEXEC after compiling.
  144.  
  145.    Address all questions and comments to:
  146.  
  147.               PCkS Associates
  148.               138 Frances Place
  149.               Hillside, NJ 07205
  150.  
  151.               On CompuServe, EasyPlex to    70152,332
  152.               On Delphi                     CHICKENJN
  153.               On GENie                      J.NICHOLSON1
  154.  
  155.  
  156. }
  157.  
  158.  
  159.  
  160. Uses
  161.   PCkSelfM;
  162.  
  163. Type
  164.   ConfigBlock = String[40];
  165.  
  166. Var
  167.   MyConfig : ConfigBlock;
  168.  
  169. begin
  170.   if ConfigBlockPresent(SizeOf(ConfigBlock)) then
  171.     if ReadConfigBlock(MyConfig, SizeOf(ConfigBlock)) then
  172.     begin
  173.       Writeln('Old value of MyConfig: ',MyConfig);
  174.       Write('Enter new value: ');
  175.       readln(MyConfig);
  176.       if ConfigBlockReWrite(MyConfig,SizeOf(ConfigBlock)) then
  177.         Writeln('Rewrote the block.')
  178.       else
  179.         Writeln('ConfigBlockReWrite failed.');
  180.     end
  181.     else
  182.       Writeln('ReadConfigBlock failed')
  183.   else
  184.   begin
  185.     Write('Enter inital value For MyConfig: ');
  186.     readln(MyConfig);
  187.     if NewConfigBlock(MyConfig, SizeOf(ConfigBlock)) then
  188.       Writeln('Created new config block')
  189.     else
  190.       Writeln('NewConfigBlock failed.');
  191.   end;
  192. end.
  193.  
  194.